package controllers

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"time"
	"zbn-oil-consumption/middleware"
	"zbn-oil-consumption/models"
	"zbn-oil-consumption/utils"
)

type User struct {
}

func (User) Register(c *gin.Context) {
	var user models.User
	if err := c.ShouldBindJSON(&user); err != nil {
		utils.Fail(c, 400, "参数错误")
		return
	}
	_, err := mUser.FindByUsername(user.Username)
	if err == nil {
		utils.Fail(c, 400, "用户名已存在")
		return
	}
	user.LastLoginTime = time.Now()
	user.CreatedAt = time.Now()
	user.Status = 1
	id, err := mUser.Add(user)
	if err != nil {
		utils.Fail(c, 400, "注册失败")
		return
	}
	fmt.Println("id", id)
	user.Id = id.(int64)
	userToken, err := middleware.GenerateTokenPair(&user)
	if err != nil {
		utils.Fail(c, 400, "生成token失败")
		return
	}
	utils.Success(c, 200, "", userToken)
}

func (User) Login(c *gin.Context) {
	var user models.User
	if err := c.ShouldBindJSON(&user); err != nil {
		utils.Fail(c, 400, "参数错误")
		return
	}
	res, err := mUser.FindByUsername(user.Username)
	if err != nil {
		utils.Fail(c, 400, err.Error())
		return
	}
	//验证密码
	if res.Password != user.Password {
		utils.Fail(c, 400, "密码错误")
		return
	}
	userToken, err := middleware.GenerateTokenPair(&res)
	if err != nil {
		utils.Fail(c, 400, "生成token失败")
		return
	}
	mUser.UpdateLastLoginTime(res.Id)
	utils.Success(c, 200, "", userToken)
}

// GetUserInfo 获取用户信息
func (User) GetUserInfo(c *gin.Context) {
	userId := c.GetInt64("userId")
	res, err := mUser.FindByUserId(userId)
	if err != nil {
		utils.Fail(c, 400, err.Error())
		return
	}
	res.Password = ""
	utils.Success(c, 200, "", res)
}

// GetAll 获取所有用户
func (User) GetAll(c *gin.Context) {
	res, err := mUser.All()
	if err != nil {
		utils.Fail(c, 400, err.Error())
		return
	}
	utils.Success(c, 200, "", res)
}

// Rank 用户排名 前20名
func (User) Rank(c *gin.Context) {
	res, err := mUser.RankByScore()
	if err != nil {
		utils.Fail(c, 400, err.Error())
		return
	}
	utils.Success(c, 200, "", res)
}
